home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / chrome / browser.jar / content / browser / preferences / feeds.js < prev    next >
Text File  |  2007-07-10  |  14KB  |  382 lines

  1. //@line 38 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  2.  
  3. //@line 40 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  4. var Cc = Components.classes;
  5. var Ci = Components.interfaces;
  6. var Cr = Components.results;
  7. var TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed";
  8. const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  9. //@line 46 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  10.  
  11. /*
  12.  * Preferences:
  13.  *
  14.  * browser.feeds.handler
  15.  * - "bookmarks", "reader" (clarified further using the .default preference),
  16.  *   or "ask" -- indicates the default handler being used to process feeds
  17.  *
  18.  * browser.feeds.handler.default
  19.  * - "bookmarks", "client" or "web" -- indicates the chosen feed reader used
  20.  *   to display feeds, either transiently (i.e., when the "use as default"
  21.  *   checkbox is unchecked, corresponds to when browser.feeds.handler=="ask")
  22.  *   or more permanently (i.e., the item displayed in the dropdown in Feeds
  23.  *   preferences)
  24.  *
  25.  * browser.feeds.handler.webservice
  26.  * - the URL of the currently selected web service used to read feeds
  27.  *
  28.  * browser.feeds.handlers.application
  29.  * - nsILocalFile, stores the current client-side feed reading app if one has
  30.  *   been chosen
  31.  */
  32.    
  33. const PREF_SELECTED_APP    = "browser.feeds.handlers.application";
  34. const PREF_SELECTED_WEB    = "browser.feeds.handlers.webservice";
  35. const PREF_SELECTED_ACTION = "browser.feeds.handler";
  36. const PREF_SELECTED_READER = "browser.feeds.handler.default";
  37.  
  38. var gFeedsPane = {
  39.   element: function(aID) {
  40.     return document.getElementById(aID);
  41.   },
  42.  
  43.   /* ........ QueryInterface .............. */
  44.   QueryInterface: function(aIID) {
  45.     if (aIID.equals(Ci.nsISupports) ||
  46.         aIID.equals(Ci.nsIObserver) ||
  47.         aIID.equals(Ci.nsIDOMEventListener))
  48.       return this;
  49.       
  50.     throw Cr.NS_ERROR_NO_INTERFACE;
  51.   },
  52.  
  53.   /**
  54.    * See nsIObserver
  55.    */
  56.   observe: function(aSubject, aTopic, aData) {
  57.     if (aTopic != "nsPref:changed" || aData != PREF_SELECTED_WEB)
  58.       return;
  59.  
  60.     if (this.element(PREF_SELECTED_ACTION).value == "reader") {
  61.       var wccr = 
  62.         Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"].
  63.         getService(Ci.nsIWebContentConverterService);
  64.       var handlerURL = this.element(PREF_SELECTED_WEB).valueFromPreferences;
  65.       var handler =
  66.         wccr.getWebContentHandlerByURI(TYPE_MAYBE_FEED, handlerURL);
  67.       if (handler)
  68.         wccr.setAutoHandler(TYPE_MAYBE_FEED, handler);
  69.     }
  70.   },
  71.  
  72.   /**
  73.    * See nsIDOMEventListener
  74.    */
  75.   handleEvent: function(aEvent) {
  76.     if (aEvent.type == "unload") {
  77.       var prefBranch = Cc["@mozilla.org/preferences-service;1"].
  78.         getService(Ci.nsIPrefBranch2);
  79.       prefBranch.removeObserver(PREF_SELECTED_WEB, this);
  80.       window.removeEventListener("unload", this, false);
  81.     }
  82.   },
  83.  
  84.   /**
  85.    * Initializes this.
  86.    */
  87.   init: function () {
  88.     var _delayedPaneLoad = function(self) {
  89.       self._initFeedReaders();
  90.       self.updateSelectedReader();
  91.     }
  92.     setTimeout(_delayedPaneLoad, 0, this);
  93.  
  94.     // For web readers, we need to call setAutoHandler if the
  95.     // preview page should be skipped (i.e. PREF_SELECTED_ACTION="reader")
  96.     // To do so, we've to add a pref-observer in order to be notified on
  97.     // actual pref-changes (i.e. not on pref changes which may not take
  98.     // affect when the prefwindow is closed)
  99.     var prefBranch = Cc["@mozilla.org/preferences-service;1"].
  100.       getService(Ci.nsIPrefBranch2);
  101.  
  102.     prefBranch.addObserver(PREF_SELECTED_WEB, this, false);
  103.     window.addEventListener("unload", this, false);
  104.   },
  105.  
  106. //@line 143 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  107.   /**
  108.    * Returns the system default feed reader as a nsILocalFile object if any,
  109.    * null otherwise.
  110.    */
  111.   _getSystemDefaultReader: function() {
  112.     var defaultReader;
  113.     try {
  114.       const WRK = Ci.nsIWindowsRegKey;
  115.       var regKey =
  116.           Cc["@mozilla.org/windows-registry-key;1"].createInstance(WRK);
  117.       regKey.open(WRK.ROOT_KEY_CLASSES_ROOT, 
  118.                   "feed\\shell\\open\\command", WRK.ACCESS_READ);
  119.       var path = regKey.readStringValue("");
  120.       if (path.charAt(0) == "\"") {
  121.         // Everything inside the quotes
  122.         path = path.substr(1);
  123.         path = path.substr(0, path.indexOf("\""));
  124.       }
  125.       else {
  126.         // Everything up to the first space
  127.         path = path.substr(0, path.indexOf(" "));
  128.       }
  129.  
  130.       defaultReader = Cc["@mozilla.org/file/local;1"].
  131.                       createInstance(Ci.nsILocalFile);
  132.       defaultReader.initWithPath(path);
  133.  
  134.       return defaultReader;
  135.     }
  136.     catch (ex) { }
  137.  
  138.     return null;
  139.   },
  140. //@line 177 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  141.  
  142.  
  143.   /**
  144.    * Populates the UI list of available feed readers.
  145.    */
  146.   _initFeedReaders: function() {
  147.     this.updateSelectedApplicationInfo();
  148.  
  149.     var readersList = this.element("readers");
  150. //@line 187 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  151.     // On Windows, list the system default feed reader if it is
  152.     // not the last-selected application already
  153.     try {
  154.       var systemDefaultReader = this._getSystemDefaultReader();
  155.       if (systemDefaultReader) {
  156.         var defaultSystemReaderFilefield = this.element("defaultSystemReaderFilefield");
  157.         defaultSystemReaderFilefield.file = systemDefaultReader;
  158.         var selectedAppFile = this.element("selectedAppFilefield").file;
  159.         if (!selectedAppFile || defaultSystemReaderFilefield.file.path !=
  160.             selectedAppFile.path) {
  161.           var defaultReaderItem = document.createElementNS(kXULNS, "listitem");
  162.           defaultReaderItem.id = "defaultSystemReaderListitem";
  163.           defaultReaderItem.className = "listitem-iconic";
  164.           defaultReaderItem.setAttribute("label", defaultSystemReaderFilefield.label);
  165.           defaultReaderItem.setAttribute("image", defaultSystemReaderFilefield.image);
  166.           readersList.appendChild(defaultReaderItem);
  167.         }
  168.       }
  169.     }
  170.     catch(ex) { }
  171. //@line 208 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  172.  
  173.     // List of web handlers
  174.     var wccr = 
  175.         Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"].
  176.         getService(Ci.nsIWebContentConverterService);
  177.     var handlers = wccr.getContentHandlers(TYPE_MAYBE_FEED, {});
  178.     if (handlers.length == 0)
  179.       return;
  180.  
  181.     var ios = 
  182.         Cc["@mozilla.org/network/io-service;1"].
  183.         getService(Ci.nsIIOService);
  184.     for (var i = 0; i < handlers.length; ++i) {
  185.       var row = document.createElementNS(kXULNS, "listitem");
  186.       row.className = "listitem-iconic";
  187.       row.setAttribute("label", handlers[i].name);
  188.       row.setAttribute("webhandlerurl", handlers[i].uri);
  189.  
  190.       var uri = ios.newURI(handlers[i].uri, null, null);
  191.       if (/^https?/.test(uri.scheme))
  192.         row.setAttribute("image", uri.prePath + "/favicon.ico");
  193.  
  194.       readersList.appendChild(row);
  195.     }
  196.   },
  197.  
  198.   /**
  199.    * Updates the label and image of the client feed reader listitem
  200.    */
  201.   updateSelectedApplicationInfo: function() {
  202.     var appItemCell = this.element("selectedApplicationCell");
  203.     var selectedAppFilefield = this.element("selectedAppFilefield");
  204.     selectedAppFilefield.file = this.element(PREF_SELECTED_APP).value;
  205.     if (selectedAppFilefield.file) {
  206.       appItemCell.setAttribute("label", selectedAppFilefield.label);
  207.       appItemCell.setAttribute("image", selectedAppFilefield.image);
  208.     }
  209.     else {
  210.       var noAppString =
  211.         this.element("stringbundle").getString("noApplicationSelected");
  212.       appItemCell.setAttribute("label", noAppString);
  213.       appItemCell.setAttribute("image", "");
  214.     }
  215.   },
  216.  
  217.   /**
  218.    * Selects a item in the list without triggering a preference change.
  219.    *
  220.    * @param aItem
  221.    *        the listitem to be selected
  222.    */
  223.   _silentSelectReader: function(aItem) {
  224.     var readers = this.element("readers");
  225.     readers.setAttribute("suppressonselect", "true");
  226.     readers.selectItem(aItem);
  227.     readers.removeAttribute("suppressonselect");
  228.   },
  229.  
  230.   /**
  231.    * Helper for updateSelectedReader. Syncs the selected item in the readers
  232.    * list with value stored invalues stored in PREF_SELECTED_WEB
  233.    */
  234.   _updateSelectedWebHandlerItem: function() {
  235.     // We should select the new web handler only if the default handler
  236.     // is "web"
  237.     var readers = this.element("readers")
  238.     var readerElts =
  239.         readers.getElementsByAttribute("webhandlerurl",
  240.                                        this.element(PREF_SELECTED_WEB).value);
  241.  
  242.     // XXXmano: handle the addition of a new web handler
  243.     if (readerElts.length > 0)
  244.       this._silentSelectReader(readerElts[0]);
  245.   },
  246.  
  247.   /**
  248.    * Syncs the selected item in the readers list with the values stored in
  249.    * preferences.
  250.    */
  251.   updateSelectedReader: function() {
  252.     var defaultReader = this.element(PREF_SELECTED_READER).value ||
  253.                         "bookmarks";
  254.     switch (defaultReader) {
  255.       case "bookmarks":
  256.         this._silentSelectReader(this.element("liveBookmarksListItem"));
  257.         break;
  258.       case "client":
  259. //@line 296 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  260.         // Keep the system default feed reader item selected if the
  261.         // last-selected application is the the system default feed reader
  262.         // and if it is already selected
  263.         var currentItem = this.element("readers").currentItem;
  264.         if (currentItem && currentItem.id == "defaultSystemReaderListitem") {
  265.           var defaultSystemReaderFile = this.element("defaultSystemReaderFilefield").file;
  266.           var selectedAppFile = this.element("selectedAppFilefield").file;
  267.           if (selectedAppFile && defaultSystemReaderFile &&
  268.               defaultSystemReaderFile.path == selectedAppFile.path)
  269.             break;
  270.         }
  271. //@line 308 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  272.  
  273.         this._silentSelectReader(this.element("selectedApplicationListitem"));
  274.         break;
  275.       case "web":
  276.         this._updateSelectedWebHandlerItem();
  277.         break;
  278.     }
  279.   },
  280.  
  281.   /**
  282.    * Displays a prompt from which the user may choose an a (client) feed reader.
  283.    */
  284.   chooseClientApp: function () {
  285.     var fp = Cc["@mozilla.org/filepicker;1"]
  286.                .createInstance(Ci.nsIFilePicker);
  287.     fp.init(window, document.title, Ci.nsIFilePicker.modeOpen);
  288.     fp.appendFilters(Ci.nsIFilePicker.filterApps);
  289.     if (fp.show() == Ci.nsIFilePicker.returnOK && fp.file) {
  290.       // XXXben - we need to compare this with the running instance executable
  291.       //          just don't know how to do that via script...
  292.       if (fp.file.leafName.match(/flock/i))
  293.         return;
  294.  
  295.       this.element(PREF_SELECTED_APP).value = fp.file;
  296.       this.element(PREF_SELECTED_READER).value = "client";
  297.     }
  298.   },
  299.  
  300.   /**
  301.    * Disables the readers list if "Show preview..." is selected, enables
  302.    * it otherwise.
  303.    */
  304.   onReadingMethodSelect: function() {
  305.     var disableList = this.element("readingMethod").value == "ask";
  306.     this.element("readers").disabled = disableList;
  307.     this.element("chooseClientApp").disabled = disableList;
  308.   },
  309.  
  310.   /**
  311.    * Maps the value of PREF_SELECTED_ACTION to the parallel
  312.    * value in the radiogroup
  313.    */
  314.   onReadingMethodSyncFromPreference: function() {
  315.     var pref = this.element(PREF_SELECTED_ACTION);
  316.     var newVal = pref.instantApply ? pref.valueFromPreferences : pref.value;
  317.     if (newVal != "ask")
  318.       return "reader";
  319.  
  320.     return "ask";
  321.   },
  322.  
  323.   /**
  324.    * Returns the value to be used for PREF_SELECTED_ACTION
  325.    * according to the current UI state.
  326.    */
  327.   onReadingMethodSyncToPreference: function() {
  328.     var readers = this.element("readers");
  329.  
  330.     // A reader must be choosed in order to skip the preview page
  331.     if (this.element("readingMethod").value == "ask" ||
  332.         !readers.currentItem)
  333.       return "ask";
  334.  
  335.     if (readers.currentItem.id == "liveBookmarksListItem")
  336.       return "bookmarks";
  337.  
  338.     return "reader";
  339.   },
  340.  
  341.   /**
  342.    * Syncs PREF_SELECTED_READER with the selected item in the readers list
  343.    * Also updates PREF_SELECTED_ACTION if necessary
  344.    */
  345.   writeSelectedFeedReader: function() {
  346.     // Force update of the action pref. This is needed for the case in which
  347.     // the user flipped from a reader to live bookmarks or vice-versa
  348.     this.element(PREF_SELECTED_ACTION).value =
  349.       this.onReadingMethodSyncToPreference();
  350.  
  351.     var currentItem = this.element("readers").currentItem;
  352.     if (currentItem.hasAttribute("webhandlerurl")) {
  353.       this.element(PREF_SELECTED_WEB).value =
  354.         currentItem.getAttribute("webhandlerurl");
  355.       this.element(PREF_SELECTED_READER).value = "web";
  356.     }
  357.     else {
  358.       switch (currentItem.id) {
  359.         case "liveBookmarksListItem":
  360.           this.element(PREF_SELECTED_READER).value = "bookmarks";
  361.           break;
  362.         case "selectedApplicationListitem":
  363.           // PREF_SELECTED_APP is saved in chooseClientApp
  364.           this.element(PREF_SELECTED_READER).value = "client";
  365.           break;
  366. //@line 403 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  367.         case "defaultSystemReaderListitem":
  368.           this.element(PREF_SELECTED_APP).value = this.element("defaultSystemReaderFilefield").file;
  369.           this.element(PREF_SELECTED_READER).value = "client";
  370.           break;
  371. //@line 408 "/cygdrive/K/tinderbuild/src/flock/mozilla/browser/components/preferences/feeds.js"
  372.       }
  373.     }
  374.   },
  375.  
  376.   autoMarkAsRead: function () {
  377.     var autoMark = document.getElementById("flock.feeds.auto_mark_as_read");
  378.     var notiePref = document.getElementById("flock.notification.show.feeds-subscribed");
  379.     notiePref.value = autoMark.value;
  380.   }
  381. };
  382.